#region License
// Copyright (c) Dmitry Antonenko (http://hystrix.com.ua)
// 
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
// 
// http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
// 
// The latest version of this file can be found at http://fluentfilters.codeplex.com/
#endregion

namespace FluentFilters
{
    using System;
    using System.Web.Mvc;

    public interface IFilterRegistry
    {
        /// <summary>
        /// Clear all registered filters
        /// </summary>
        void Clear();

        /// <summary>
        /// Add action filter that will be used for all application
        /// </summary>
        /// <typeparam name="T">Filter type</typeparam>
        void Add<T>();

        /// <summary>
        /// Add action filter and specify criteria
        /// </summary>
        /// <typeparam name="T">Filter type</typeparam>
        /// <param name="criteria">The criteria</param>
        void Add<T>(Action<IFilterCriteriaBuilder> criteria);

        /// <summary>
        /// Remove the action filter by specified type
        /// </summary>
        /// <typeparam name="T">Filter type</typeparam>
        void Remove<T>();

        /// <summary>
        /// Gets registered filters
        /// </summary>
        FilterInfo GetFilters(FilterRegistryContext context);

        /// <summary>
        /// Get registered filter instance by type
        /// </summary>
        /// <param name="filterType">Filter type</param>
        object GetFilterInstance(Type filterType);
    }
}